home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / clip.i < prev    next >
Text File  |  1997-10-26  |  10KB  |  290 lines

  1. IMPLEMENTATION MODULE Clip;
  2.  
  3. (*==============================================================*
  4.  * Modul:               Clipboard-Modul, nach Atari-Doku        *
  5.  * Autor:               Johannes G”ttker-Schnetmann             *
  6.  * erstellt am:         10.02.1992                              *
  7.  * letzte Žnderung am:  09.03.1992                              *
  8.  * Version:             1.1                                     *
  9.  * Interne Version:     V#0003                                  *
  10.  *==============================================================*
  11.  
  12.  *----------------------------------------------------------------------------
  13.  * Datum    Vers. Autor  Žnderung (Arbeitsbericht)
  14.  *----------------------------------------------------------------------------
  15.  * 10.02.92 0001  JGS    Erstellen
  16.  * 08.03.92 0002  JGS    Environment bercksichtigen 
  17.  * 09.03.92 0003  JGS    ScrapClear/ScrapDirty
  18.  * 07.09.92 0004  DS     Bei GetScrap wird ein \CLIPBRD\ genommen, falls auf einem
  19.  *                       Laufwerk vorhanden. Erst danach wird beim User angefragt.
  20.  * 08.12.92 0005  DS     Bei folderExists wird auch Rcksicht auf gelockte Laufwerke
  21.  *                       genommen, d.h. bei ACCDN wird nicht nachgefragt
  22.  * 11.09.94 0006  DS     Wenn wir etwas ins Clipboard schreiben, wird ein Broadcast 
  23.  *                       mit der Message SCCHANGED gemacht.
  24.  *----------------------------------------------------------------------------
  25.  *)
  26.  
  27. FROM SYSTEM IMPORT ADR, ADDRESS;
  28. FROM Void IMPORT v;
  29. IMPORT CatFiles;
  30. IMPORT MagicAES;
  31. IMPORT MagicDOS;
  32. IMPORT mtDir;
  33. IMPORT mtAppl;
  34. IMPORT mtAlerts;
  35. IMPORT MagicStrings;
  36. IMPORT mtCommand;
  37. IMPORT Mintbind;
  38. IMPORT CatTypes;
  39. IMPORT CatGlobal;
  40.  
  41. VAR scrapDirty : BOOLEAN;
  42.  
  43. PROCEDURE ScrapClear(REF f, not : ARRAY OF CHAR);
  44. (* leert das Clipboard falls Pfad leer, sonst den bergebenen Pfad *)
  45. VAR path : CatTypes.pathStrType;
  46. BEGIN
  47.   MagicStrings.Assign(f, path);
  48.   (* Falls kein Pfad bergeben wurde, dann mal anfragen *)
  49.   IF (path[0] = 0C) & ~GetScrap(path) THEN RETURN END;
  50.   CatFiles.ClearPath (path, 'SCRAP.*', not);
  51.   scrapDirty := FALSE;
  52. END ScrapClear;
  53.  
  54. PROCEDURE folderExist(l : CARDINAL; REF pfad : ARRAY OF CHAR):BOOLEAN;
  55. VAR dta : MagicDOS.DTA;
  56.     oDta: ADDRESS;
  57.     res : INTEGER;
  58.     path: CatTypes.pathStrType;
  59.     dHandle: LONGINT;
  60. BEGIN
  61.   MagicStrings.Assign (pfad, path);
  62.   IF l = 0 THEN RETURN FALSE END;
  63.   path[l-1] := 0C; (* Den backslash am Ende weglassen *)
  64.   IF ~CatGlobal.isMintDomain
  65.   THEN
  66.     oDta := MagicDOS.Fgetdta ();
  67.     MagicDOS.Fsetdta (ADR(dta));
  68.     res := MagicDOS.Fsfirst (path, {MagicDOS.Folder});
  69.     MagicDOS.Fsetdta (oDta);
  70.     RETURN (res = 0) OR (res = MagicDOS.EAccDn)
  71.   ELSE
  72.     dHandle := Mintbind.Dopendir (path, 0);
  73.     IF dHandle >= 0
  74.     THEN
  75.       v.lint := Mintbind.Dclosedir (dHandle);
  76.       RETURN TRUE;
  77.     END;
  78.     RETURN FALSE;
  79.   END;
  80.   (*
  81.   mtDir.SearchParas(pfad, {MagicDOS.Folder}, ADR(dta), TRUE);
  82.   RETURN mtDir.Found();
  83.   *)
  84. END folderExist;
  85.  
  86. PROCEDURE GetScrap(VAR f : ARRAY OF CHAR):BOOLEAN;
  87. (* Liefert den aktuellen Clipboard-Ordner *)
  88. VAR s, scrap : CatTypes.pathStrType;
  89.     name, n  : CatTypes.nameStrType;
  90.     suff     : CatTypes.extStrType;
  91.     drv      : CARDINAL;
  92.     z        : CARDINAL;
  93.     b        : BITSET;
  94.     setNew   : BOOLEAN;
  95.  
  96. BEGIN
  97.   setNew := FALSE; (* vorl„ufig nicht neu setzen *)
  98.   f[0]   := 0C;    (* Erstmal entwerten *)
  99.  
  100.   b := MagicAES.ScrpRead(scrap);
  101.  
  102.   IF b = {} THEN RETURN FALSE END;
  103.   (* if scrp_read() returns an error code of zero, then the 
  104.      application should act as though nothing is available
  105.      on the clipboard *)
  106.  
  107.   (* Jetzt noch im Environment nachsehen, falls bisher noch nichts gefunden *)
  108.   IF scrap[0] = 0C THEN
  109.     IF ~mtCommand.EnvVar(mtCommand.EnvClipbrd, scrap) THEN
  110.       scrap[0] := 0C;
  111.     END;
  112.     MagicStrings.CAPS(scrap);
  113.   END;
  114.  
  115.   IF scrap[0] # 0C THEN
  116.     IF scrap[MagicStrings.Length(scrap)-1] # '\'
  117.     THEN
  118.       MagicStrings.Append('\', scrap);
  119.     END;
  120.       
  121.     mtDir.SplitPath(scrap, s,n,suff); (* In die Bestandteile aufspalten *)
  122.     z := MagicStrings.Length(s);
  123.  
  124.     setNew := (n[0] # 0C) OR (suff[0] # 0C) OR (z = 0) OR (s[z-1] # '\');
  125.     (* In all diesen F„llen muž das Clipboard neu gesetzt werden *)
  126.  
  127.     IF (z > 0) & (s[z-1] # '\') THEN
  128.       MagicStrings.Append('\', s);
  129.       INC(z); (* Fr den Test unten *)
  130.     END;
  131.  
  132.     IF ~folderExist(z, s) THEN
  133.       (* Dann probieren, ob das ganze evtl. schon ein
  134.         Pfad ist und nur der Backslash vergessen wurde *)
  135.       z := LENGTH(scrap);
  136.       MagicStrings.Append('\', scrap);
  137.       IF ~folderExist(z+1, scrap) THEN
  138.         scrap[0] := 0C; (* Dann User fragen  *)
  139.       END;
  140.     ELSE
  141.       MagicStrings.Assign(s, scrap);
  142.     END;
  143.   END;
  144.  
  145.   IF (scrap[0] = 0C) THEN (* User fragen *)
  146.     (* Zun„chst mal bei den existierenden Laufwerken nach dem Rechten sehen..*)
  147.     MagicDOS.Dsetdrv(MagicDOS.Dgetdrv(),v.lbset);
  148.     IF     2 IN v.lbset THEN drv := 2 (* erstmal auf C:\ *)
  149.     ELSIF  0 IN v.lbset THEN drv := 0 (* dann auf A:\ *)
  150.     ELSE (* und jetzt mal suchen, ob sonst vielleicht noch eins zu finden ist *)
  151.       z := 0;
  152.       WHILE ~(z IN v.lbset) & (z < 31) DO INC(z) END;
  153.       IF ~(z IN v.lbset) THEN (* Da kann man nichts machen.. *)
  154.         v.int := mtAlerts.Alert(1, '[3][|Kein Laufwerk gefunden!][[Abbruch]');
  155.         RETURN FALSE
  156.       END;
  157.     END;
  158.  
  159.     scrap := CatTypes.rawClip;
  160.     scrap[0] := CHR(ORD('A')+drv); (* passendes Laufwerk aussuchen *)
  161.     (* mal nachsehen, ob's dort ein CLIPBRD gibt *)
  162.  
  163.     IF ~folderExist(LENGTH(CatTypes.rawClip), scrap) 
  164.     THEN
  165.       IF mtAlerts.Alert(1, '[7][|Klemmbrett-Ordner|nicht festgelegt!][[Suchen|:[Abbruch]') = 1
  166.       THEN 
  167.         (* nur das Laufwerk vorschlagen *)
  168.       
  169.         scrap[3] := 0C;
  170.         MagicStrings.Append('*.*', scrap);
  171.         name := '';
  172.         MagicAES.WindUpdate(MagicAES.BEGMCTRL);
  173.         IF ~mtDir.GetDir(scrap, name, 'Clipboard-Ordner aussuchen') THEN (* Mal beim User fragen *)
  174.           MagicAES.WindUpdate(MagicAES.BEGMCTRL);
  175.           RETURN FALSE
  176.         END;
  177.         MagicAES.WindUpdate(MagicAES.ENDMCTRL);
  178.   
  179.         mtDir.SplitPath (scrap, s, n, suff); (* Zerlegt Pfad in seine Bestandteile *)
  180.         MagicStrings.Assign(s, scrap);
  181.         (* Doppelte Deklaration, das sonst in SplitPath Probleme auftreten k”nnen *)
  182.   
  183.         IF name[0] # 0C THEN(* Es wurde ein Dateiname eingegeben *)
  184.           IF (mtAlerts.Alert(1, '[3][|Clipboard-Ordner anlegen?][[Ok|:[Abbruch]') = 1)
  185.           THEN (* Versuchen, diesen anzulegen *)
  186.             IF ~CatFiles.SetPath(scrap) OR (MagicDOS.Dcreate(name) < 0) THEN
  187.               v.int := mtAlerts.Alert(1, '[3][|Das Klemmbrett konnte|nicht angelegt werden!][[Abbruch]');
  188.               RETURN FALSE
  189.             END;
  190.             MagicStrings.Append('\', name);
  191.             MagicStrings.Append(name, scrap);
  192.           ELSE
  193.             RETURN FALSE
  194.           END;
  195.         END;
  196.         setNew := TRUE; (* Jetzt in jedem Fall setzen *)
  197.       ELSE
  198.         RETURN FALSE
  199.       END;
  200.     ELSE
  201.       (* folder existiert, neu setzen darauf! *)
  202.       setNew := TRUE;
  203.     END;
  204.   END;
  205.   IF setNew THEN MagicAES.ScrpWrite(scrap); (* und mal alles anmelden *) END;
  206.   MagicStrings.Assign(scrap, f); (* .. und am Ende das Resultat zuweisen *)
  207.   RETURN TRUE
  208. END GetScrap;
  209.  
  210. PROCEDURE ScrapDirty(REF f : ARRAY OF CHAR):BOOLEAN;
  211. (* Ist etwas im Clipboard? *)
  212. (* d.h. sieht entweder im bergebenen Pfad oder im Clipboard nach *)
  213. (* ob ein SCRAP.TXT vorhanden ist *)
  214. VAR path : CatTypes.pathStrType;
  215. BEGIN
  216.   MagicStrings.Assign(f, path);
  217.   (* Falls kein Pfad bergeben wurde, dann mal anfragen *)
  218.   IF (path[0] = 0C) & ~GetScrap(path) THEN
  219.     scrapDirty := FALSE
  220.   ELSE
  221.     MagicStrings.Append(CatTypes.scrapFile, path);
  222.     scrapDirty := CatFiles.Exists (path);
  223.   END;
  224.   RETURN scrapDirty;
  225. END ScrapDirty;
  226.  
  227. PROCEDURE ScrapWritten (type: BITSET; defExt: ARRAY OF CHAR);
  228. (* Wir haben selber etwas in's Clipboard geschrieben *)
  229.   VAR msg : ARRAY [0..7] OF INTEGER;
  230.       strPtr : CatTypes.Str255Ptr;
  231.       appName : CatTypes.String127;
  232.       i       : INTEGER;
  233.       otherId : INTEGER;
  234.       pType   : INTEGER;
  235. BEGIN
  236.   scrapDirty := TRUE;
  237.   (* Bei MultiTOS oder Magix >= 2.0 *)
  238.   IF CatGlobal.multiTOS OR
  239.      (CatGlobal.magIx & (CatGlobal.magIxVer >= $200))
  240.   THEN
  241.     (* Nachricht basteln *)
  242.     msg[0] := MagicAES.SCCHANGED;
  243.     msg[1] := mtAppl.ApplIdent;
  244.     msg[2] := 0;
  245.     msg[3] := INTEGER(type);
  246.     strPtr := ADR (msg[4]);
  247.     IF HIGH (defExt) >= 4 THEN defExt [4] := 0C; END;
  248.     MagicStrings.Assign (defExt, strPtr^);
  249.     msg[6] := 0;
  250.     msg[7] := 0;
  251.     IF CatGlobal.multiTOS
  252.     THEN
  253.       v.int := MagicAES.ExtShelWrite (MagicAES.BroadcastMessage, 0, 0, ADR(msg), "");
  254.     ELSE
  255.       (* Mittels ApplSearch alle Applikationen durchgehen 
  256.        *)
  257.       FOR i := 0 TO 12 DO appName[i] := 0C; END;
  258.       IF MagicAES.ApplSearch (MagicAES.APFIRST, appName, pType, otherId)
  259.       THEN
  260.         REPEAT 
  261.           IF (pType # MagicAES.APTSYSTEM) & 
  262.              (otherId # mtAppl.ApplIdent)
  263.           THEN
  264.             (* Message verschicken *)
  265.             MagicAES.ApplWrite (otherId, 16, msg);
  266.           END;
  267.           FOR i := 0 TO 12 DO appName[i] := 0C; END;
  268.         UNTIL ~MagicAES.ApplSearch (MagicAES.APNEXT, appName, pType, otherId);
  269.       END;
  270.     END;
  271.   END;
  272. END ScrapWritten;
  273.  
  274. PROCEDURE SomethingInScrap (): BOOLEAN;
  275. (* Sieht intern in einer Variablen nach. Im Zweifelsfall eher 
  276.  * ScrapDirty benutzen
  277.  *)
  278. BEGIN
  279.   RETURN scrapDirty
  280. END SomethingInScrap;
  281.  
  282. PROCEDURE ScrapIsDirty();
  283. BEGIN
  284.   scrapDirty := TRUE;
  285. END ScrapIsDirty;
  286.  
  287. BEGIN
  288.   scrapDirty := FALSE;
  289. END Clip.
  290.